package com.example.weibo.Controller;

import com.example.weibo.mapper.UserMapper;
import com.example.weibo.pojo.dto.UserLoginDto;
import com.example.weibo.pojo.dto.UserRegDto;
import com.example.weibo.pojo.entity.User;
import com.example.weibo.pojo.vo.UserVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Date;

/**
 * @Name: UserController
 * @Author: 西风残叶
 * @Company: 朝兮网络工作室
 * @Data: 2023/11/15 22:05
 */
@RestController
public class UserController {
    @Autowired // 自动装配
    UserMapper mapper;

    /**
     * 业务: 注册业务;新增用户并对其判断是否存在
     * @param regDto : 用户输入的字段
     * @return :返回一个结果
     */
    @RequestMapping("/reg")
    public int reg(@RequestBody UserRegDto regDto) {
        // 使用dto可以对想要的字段进行获取,而不是全部都获取
        System.out.println(regDto);
        UserVO userVO = mapper.selectByUsername(regDto.getUsername());
        // 判断用户名是否存在
        if (userVO != null) {
            return 2;
        }
        // 把user里面的三个数据装进entity里面
        User u = new User();
        // 从regDto对象中复制到u对象
        BeanUtils.copyProperties(regDto, u);
        // 获取当前时间
        u.setCreated(new Date());
        // 调用mapper里面的insert方法
        mapper.insert(u);
        return 1;
    }


    /**
     * 业务:登录业务;
     * @param user :登录的用户对象
     * @return :返回结果
     */
    @RequestMapping("/login")
    public int login(@RequestBody UserLoginDto user , HttpSession session){
        // 通过用户输入的用户名查询数据
        UserVO u = mapper.selectByUsername(user.getUsername());
        if (u!=null){
            if (user.getPassword().equals(u.getPassword())){
                // 把当前登录得到的UserVO保存到客户端会话对象里面
                // Session保存的数据类似于是一个Mpa集合,是键值对的形式保存
                // session对象是有SpringMVC框架自动会帮助我们找到当前客户所对应的回话对象中
                session.setAttribute("user",u);
                return 1; // 登录成功
            }
            return 2; // 密码错误
        }
        return 3; //用户不存在
    }

    /**
     * 业务:从回会话中获取用户是否登录
     * @param session :用户对象
     */
    @RequestMapping("/currentUser")
    // HttpSession是会话对象
    public UserVO currentUser(HttpSession session){
        // 从会话中得到登录成功时保存在会话对象中的用户对象,返回的是一个Object类型的对象需要强制转换
        return (UserVO) session.getAttribute("user");
    }

    /**
     * 业务 :退出登录
     * @param session :会话对象
     */
    @RequestMapping("/logout")
    public void logout(HttpSession session){
        // 把登录成功时保存在回话对象中的用户对象删除掉即可
        //并且会话对象只有一个
        session.removeAttribute("user");
    }
}
